查看原文
其他

极简数据分析:LangChain与ChatGPT交互

爬虫俱乐部 Stata and Python数据分析 2023-10-24

本文作者:罗天尧 新疆大学商学院 

本文编辑:管文娜

技术总编:郭泽源








Stata and Python 数据分析

     爬虫俱乐部将于2023年8月1日至9日河南大学(河南开封)举行Stata编程技术Python编程技术定制培训,同时在网络平台进行直播,提供线上学习的方式。线上线下培训均有专门的答疑团队。大家感兴趣请点击推文链接《爬虫俱乐部2023第一期编程训练营开始报名啦!》点击文末阅读原文查看课程详情及报名方式!

一、什么是LangChain?
LangChain是针对大语言模型(LLMs)构建的应用框架,封装了多种语言模型及参数,多用于搭建AI工作流。类似爬虫Scrapy框架的设计理念,LangChain包含Models(模型库)、Prompts(Prompt管理与优化)、Indexes(提供数据结构化功能)、Memory(为交互提供上下文缓存)等核心模块,拆解AI交互的全流程,优化输出结果,帮助用户快速上手。
二、LangChain与数据分析

在数据分析领域,NumPy和Pandas提供了丰富的语法和功能,但对于一些初学者或非专业人士来说,它们可能会稍显复杂。这时,LangChain可以减轻你的负担,助你专注于数据分析本身。

1.导入外部库
使用到的包(#为依赖包):
#pip install openai #python.exe -m pip install --upgrade pip#pip install tabulateimport pandas as pdfrom langchain.chat_models import ChatOpenAIfrom langchain.agents import create_pandas_dataframe_agentfrom langchain.agents.agent_types import AgentTypeimport os

2.数据与秘钥准备

os.environ['OPENAI_API_KEY'] = 'U KEY'#测试集data = { 'Date': ['2023-06-28', '2023-06-29', '2023-06-30', '2023-07-01', '2023-07-02'], 'Open': [100.0, 102.5, 99.8, 101.2, 103.0], 'High': [105.0, 103.5, 101.2, 104.0, 106.0], 'Low': [98.0, 101.2, 98.5, 99.8, 101.0], 'Close': [103.2, 100.8, 100.0, 102.0, 105.5], 'Volume': [1000000, 1200000, 800000, 900000, 1100000]}
感兴趣的同学,也可以测试tushare、yfinance中的数据。

3.调用模型进行分析

不同于“[定制属于自己的“贾维斯”——Python调用Chat]”介绍的方法,langchain为我们提供了完善封装的模型、参数,无需复写模型,只按需调用即可。

将模型参数等传入agent实例化。

df = pd.DataFrame(data) agent = create_pandas_dataframe_agent( ChatOpenAI(temperature=0, model="gpt-3.5-turbo-0613"), df, verbose=True, agent_type=AgentType.OPENAI_FUNCTIONS,) #openai接口模型,数据,输出详情,代理类型
调用agent,针对传入数据“分析”。
agent.run("该数据中共有几日的交易数据?最高价是哪一天?") #传入Prompt
输出结果中,GPT给出了分项回答与最终回答,并生成了对应的分析代码。值得注意的是,langchain甚至贴心地提供了retry装饰器(飘红处),墙内用户体验拉满。

值得一提的是,我们在“[迈向交互式编程,ChatGPT更新!]”介绍过基于自定义函数的交互方法,而langchain则通过预写的python_repl_ast函数(即Python的shell),直接将chatGPT给出的代码传入Python,并计算出最终结果,这是一个很棒的做法。
在一些延伸计算中,chatGPT还会给出定义和计算公式。
agent.run("振幅是多少?")

4.潜在问题
测试中,我们发现了LangChain的一个Bug。例如让GPT输出日收益率时,langchain会抛出异常:
langchain.schema.OutputParserException: Could not parse tool input: {'name': 'python', 'arguments': "df['Daily Return'] = df['Close'].pct_change()\ndf"} because the `arguments` is not valid JSON.
经对源码反复测试,这个Bug可能源于LangChain对prompt的约束不足(GPT回复的格式可能为非json格式或json数组),同时LangChain的数据清洗并未完全考虑边界情形(在对dataframe的交互中,LangChain只编写了针对json的处理方式),导致异常抛出。在抛出异常的源码中,还有这样一串注脚:

这里的__arg1便是langchain指定的json格式参数:
{'__arg1': "df['Daily Return'] = df['Close'].pct_change()\ndf"}
由于LangChain的架构过于复杂,本文只能提供一个欠佳的“补丁”:
#将"\python\lib\site-packages\langchain\agents\openai_functions_agent\base.py"中的_parse_ai_message改写为:
def _parse_ai_message(message: BaseMessage) -> Union[AgentAction, AgentFinish]: """Parse an AI message.""" if not isinstance(message, AIMessage): raise TypeError(f"Expected an AI message got {type(message)}")
function_call = message.additional_kwargs.get("function_call", {})
if function_call: function_call = message.additional_kwargs["function_call"] function_name = function_call["name"] try: #print(function_call["arguments"]) _tool_input = json.loads(function_call["arguments"]) #print(_tool_input) except JSONDecodeError: try: _tool_input = json.dumps({"__arg1": function_call["arguments"]}) _tool_input = json.loads(_tool_input) #print(_tool_input) except: raise OutputParserException( f"Could not parse tool input: {function_call} because " f"the `arguments` is not valid JSON." )
修改源码后,信息解析格式正确了,但Langchain并未唤醒python_repl_ast函数。

这里只能复制出计算日收益的代码,手动运行。
df['Daily Return'] = df['Close'].pct_change()df['Daily Return']
执行结果:

END

重磅福利!为了更好地服务各位同学的研究,爬虫俱乐部将在小鹅通平台上持续提供金融研究所需要的各类指标,包括上市公司十大股东、股价崩盘、投资效率、融资约束、企业避税、分析师跟踪、净资产收益率、资产回报率、国际四大审计、托宾Q值、第一大股东持股比例、账面市值比、沪深A股上市公司研究常用控制变量等一系列深加工数据,基于各交易所信息披露的数据利用Stata在实现数据实时更新的同时还将不断上线更多的数据指标。我们以最前沿的数据处理技术、最好的服务质量、最大的诚意望能助力大家的研究工作!相关数据链接,请大家访问:(https://appbqiqpzi66527.h5.xiaoeknow.com/homepage/10)或扫描二维码:


对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!







往期推文推荐

爬取A股上市公司指定年份年报

机器学习——监督学习入门‍‍禁忌魔法解封,击穿专业壁垒:ChatGPT code interpreter暑期来啦~⼀起看⼀看近期的天⽓情况【命令重磅更新】在Stata中深入使用ChatGPT
爬虫俱乐部2023第一期编程训练营开始报名啦!
【爬虫基础】Scrapy爬虫框架迈向交互式编程,ChatGPT更新!一个简单又好玩的Python库——MyQR
replace命令的“加强版”!——如何使用ereplace,结合egen
XML 轻松读取:用 Python 发现数据宝藏

爬虫俱乐部重磅推出cnstata.com.cn

Markdown:让数学公式输入更方便!

处理日期的好手:pendulum
定制属于自己的“贾维斯”——Python调用Chat
学会format,数据格式任你拿捏【Python实战】游客最青睐的城市,你的家乡上榜了吗?

What’ new ? 速通Stata 18

【爬虫实战】Python爬取美食菜谱揭秘网络中心人物,你会是其中之一吗?     关于我们 

   微信公众号“Stata and Python数据分析”分享实用的Stata、Python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。

   武汉字符串数据科技有限公司一直为广大用户提供数据采集和分析的服务工作,如果您有这方面的需求,请发邮件到statatraining@163.com,或者直接联系我们的数据中台总工程司海涛先生,电话:18203668525,wechat: super4ht。海涛先生曾长期在香港大学从事研究工作,现为知名985大学的博士生,爬虫俱乐部网络爬虫技术和正则表达式的课程负责人。



此外,欢迎大家踊跃投稿,介绍一些关于Stata和Python的数据处理和分析技巧。

投稿邮箱:statatraining@163.com投稿要求:1)必须原创,禁止抄袭;2)必须准确,详细,有例子,有截图;注意事项:1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存